import sys

sys.path.append('/Users/xuchaosheng/anaconda3/lib/python3.6/site-packages')

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from scipy.sparse import csr_matrix
from gensim import corpora, models, similarities
from collections import defaultdict
from gensim.models import word2vec
from pymongo import MongoClient
from gensim import corpora
from pprint import pprint
from sklearn import svm

import jieba.posseg as pseg
import numpy as np
import logging
import gensim
import jieba
import os
import re

logging.basicConfig(format = '%(asctime)s : %(levelname)s : %(message)s', level = logging.INFO)

client = MongoClient('localhost', 27017)

qiancheng_db = client['qiancheng_db']
qiancheng_posts, qiancheng_corps = qiancheng_db['qiancheng_posts'], qiancheng_db['qiancheng_corps']

keywords = {
    "金融行业": {
        "证券": {
            'relative': [
                "证券经纪人/f", '证券助理/m', '股票分析师/f', '证券投资顾问/f', '证券事务代表/m', '证券理财顾问/f', '证券市场总监/m', '证券分析讲师/m',
                '证券研究员/b',
                '外汇经纪人/f', '期货经纪人/f', "证券代表/m", "证券分析/b", '投资服务/f', '金融操盘手/b', '证券市场专员/f', '证券事务助理/m', '证券客户经理/m',
                '金融交易员/f', '外汇分析/b', '短线交易员/b', '期货居间人/f', '黄金交易员/b', '证券分析师/m', '证券实习/f', '证券从业资格讲师/m', '证券投资管理/m',
                '证券经理/m', '金融产品经理/m', '基金项目经理/m', '理财顾问/f', '证券理财经理/m'
            ]
        },
        "银行": {
            'relative': [
                '银行柜员/f', '银行项目客服/f', '客户经理/m', '银行信贷专员/f', '银行金融服务专员/f', '银行后台服务/b', '信用卡客户经理/m',
                '银行客户专员/f', '银行文员/m', '银行客户服务代表/f', '银行贷款专员/f', '信用卡业务代表/f', '银行经理/m', '信审核查/b', '银行客服代表/f',
                '银行大堂助理/m', '银行渠道专员/f', '银行渠道业务经理/m', '银行投资顾问/f', '银行信托理财经理/f', '银行客户维护专员/f',
                '银行信贷主管/m', '银行大堂经理/m', '风控主管/b', '大客户经理/m', '审批专员/b', '银行外汇交易/f', '贷款业务/f', '贷款审查/b', '综合柜员/f',
                '稽核/b', '风险专员/b', '支付结算/b', '信用卡专员/f', '理财顾问/f', '信用卡催收/b', '小微客户经理/m', '柜面复核/b',
                '风险督查/b', '运营经理/m', '投资顾问/f'
            ]
        }
    },
    "快消房产行业": {
        "客服": {
            'relative': [
                '客服/f', '呼叫中心坐席代表/f', '销售客服/f', '客服专员/f', '客服经理/m', '客服总监/m', '客户服务/f', '高级客服/f', '续约客服/f', '推广客服/f',
                '电话客服/m', '产品客服/m', '网络客服/m', '淘宝客服/m', '房产客服/m', '售后客服/b', 'IT客服岗/m', '呼入客服/m', '粤英双语客服/m', '外企英文客服/m',
                '国际客服/m', '外呼客服/f', '英文客服/m', '呼叫中心客服/m'
            ]
        },
        "销售": {
            'relative': [
                '销售/f', '销售助理/m', '销售代表/f', '销售管培生/m', '大客户销售/f', '销售储干/m', '市场营销/m', '销售顾问/f', '销售管理/m', '销售主管/m',
                '销售总监/m',
                '销售跟单/f', '电话销售/f', '大区经理/m', '区域销售/f', '网络销售/f', '销售精英/f', '业务顾问/f', '业务员/f', '导购员/f', '品牌营销/m',
                '渠道管理/m',
                '奢侈品销售/f', '业务代表/f', '销售支持/b', '渠道经理/m', '市场总监/m', '营销策划/m', '市场部经理/m', '市场调研/b', '市场推广/m',
                '市场策划/m', '市场专员/f',
                '市场助理/m', '市场经理/m', '业务经理/m'
            ]
        }
    },
    "IT互联科技行业": {
        "产品": {
            'relative': [
                '产品助理/m', '产品经理/m', '移动端产品/m', '数据产品/m', '电商产品/m', '用户研究/b', '产品总监/m', '产品VP/m', '产品运营/m', '产品专员/f',
                '产品主管/m', '产品部助理/m', '产品需求专员/m', '产品设计/m'
            ]
        },
        "技术": {
            'relative': [
                '前端开发/b', 'HTML5/b', 'Java开发工程师/b', 'python/b', 'PHP/b', '.NET/b', 'C#/b', 'C++/b', 'Delphi/b', 'Perl/b', 'Ruby/b',
                'Node.js/b', 'ERP技术开发/b', 'Golang/b', 'Linux研发/b', 'Windows研发/b', '游戏开发/b', '软件研发/b', 'Android/b', 'IOS/b', 'U3D/b',
                'COCOS2DX/b',
                'APP研发/b', '测试工程师/b', '软件测试/b', '移动端测试/b', '自动化测试/b', '自然语言处理/b', '数据挖掘工程师/b', '区块链工程师/b', '图像识别/b',
                '机器学习/b',
                '大数据工程师/b', '测试开发/b', '硬件测试/b', '数据科学家/b', '运维工程师/b', '运维开发工程师/b', '技术支持工程师/b', '软件技术支持/b',
                'ERP实施顾问/b',
                '网络工程师/b', '系统工程师/b', '系统安全/b', '数据库管理员/b', '数据通信/b', '技术经理/b', '技术总监/b', '架构师/b', '大数据技术经理/b',
                '数据架构师/b',
                '算法经理/b', '算法工程师/b', '运维总监/b', '技术VP/b', 'CTO/b', 'BI工程师/b', 'Hadoop/b', 'Spark/b', 'AI研发工程师/b', '人脸识别/b',
                '深度学习工程师/b',
                '数据建模/b', '爬虫工程师/b', '数据分析/b', '推荐算法工程师/b', 'NLP/b', '首席科学家/b', '语音识别/b', '自动驾驶/b'
            ]
        }
    },
    "咨询行业": {
        "会计": {
            'relative': [
                '会计/b', '注册会计师/b', '助理会计/b', '核算会计/b', '成本会计/b', '财务会计/b', '出纳会计/b', '出纳/b', '财务/b', '财务经理/m',
                '会计主管/m', '财务总监/m', '财务专员/b', '财务主管/m', '财务助理/b'
            ]
        },
        "教育": {
            'relative': [
                '教师/f', '助教/m', '培训师/f', '在线教育/f', '辅导老师/f', '大学教师/f', '高中教师/f', '初中教师/f', '小学教师/f', '幼儿教师/f',
                '理科教师/f', '文科教师/f',
                '英语教师/f', '体育教师/f', '美术教师/f', '音乐教师/f', '教务管理人员/m', '校长/m', '教育产品开发/b', '培训助理/助教/m', '培训师/讲师/f',
                '培训策划/m',
                'IT培训/m', '招生/课程顾问/f', '兴趣培训/f', '培训督导/m', '产品培训/m', '教育专员/f', '教育规划/b', '辅导员/f', '教育咨询/f', '教育设计/b',
                '教育顾问/f',
                '教育培训总监/m', '讲师/m', '销售培训/m', '教育导师/m', '教育产品策划/m'
            ]
        },
        "法律": {
            'relative': [
                '法律文案/m', '法律翻译/b', '法律管理/m', '法务助理/m',
                '法务/m', '法务专员/m', '法务经理/主管/m',
                '律师助理/m', '律师/m', '法律顾问/f',
                '知识产权/m', '合规专员/b', '法务总监/m',
                '法务实习生/m', '法务主管/m', '法务担当/m', '版权助理/m',
                '合规助理/m', '合同法务/m', '专利主管/m', '商标代理/m'
            ]
        }
    },
    "制造行业": {
        "汽车": {
            'relative': [
                '汽车设计/b', '汽车模具设计/b', '汽车燃油设计/b', '汽车电子工程师/b', '汽车电子技术/b', '汽车动力系统/b', '汽车底盘/总装/b', '汽车装配/b',
                '汽车安全性能/b', '汽车维修/b', '汽车装饰/b', '汽车零配件/b', '汽车机构工程师/b', '发动机工程师/b', '总装工程师/b', '动力总成工程师/b',
                '底盘工程师/b', '汽车项目管理/b', '汽车质量管理/b', '电气工程师/b', '车身造型设计/b', '新能源电池工程师/b', '新能源工程师/b', '汽车线束工程师/b',
                '汽车空调工程师/b', '汽车电子软件开发/b', '汽车零件设计/b', '机械设计工程师/b', '汽车试验/b', '汽车研发/b'
            ]
        },
        "医药": {
            'relative': [
                '医生/f', '医药技术研发/b', '生物工程/b', '生物医药/b', '微生物检验/b', '分子生物学/b', '生物医学工程师/b',
                '生物制药/b', '药品生产/b', '药理学/b', '药物制剂/b',
                '药品化学分析/b', '医疗器械生产研发/b', '临床研究员/b', '临床数据分析员/b', '实验室技术员/b', '配料员/b', '放射科/b', '中医医师/b', '护士/f',
                '麻醉师/f',
                '护理/f', '有机合成研究员/b', '临床医学/b', '康复治疗/b', '药物安全/b', '动物实验/b', '药物质量分析/b', 'QA质量管理/b', '药剂师/b',
                '新药研发/b', '医生助理/m',
                '助理医生/f', '宠物医生/f'
            ]
        },
        "化工": {
            'relative': [
                '化工工程师/b', '实验室技术员/b', '涂料研发/b', '配色技术员/b', '塑料工程师/b', '化妆品研发/b', '化学分析/b', '食品工程/b', '化学检测员/b',
                '化学技术支持/b', '医药化学分析/b', '化学实验员/b', '化学合成/b', '环境化学检测/b', '化学工艺工程师/b', '品控化学师/b', '化学研发助理/b',
                '实验室分析员/b', '化学工艺工程师/b', '喷涂技术员/b', '化学师/b', '质量分析员/b', '产品工程师/b', '技术主管/m', '研发工程师/b', '调色工程师/b',
                '纳米材料/b', '材料工程师/b', '工程师助手/b', '检测员/b', '化验员/b'
            ]
        }
    }
}

from six import iteritems

stoplist = []
with open('/Users/xuchaosheng/Workspace/KNX/stopWords.txt') as f:
    for i in f.readlines():
        stoplist.append(i.strip())

tag_list = [file.split('-')[0] for file in os.listdir('train')]
texts = [[word for word, flag in pseg.cut(open('train/' + file, encoding = 'utf-8').read()) if word not in stoplist and flag in ['v', 'n']] for file in os.listdir('train')]

# for file in os.listdir('train'):
#     tag_list.append(file.split('-')[0])

# try:
#     tag_list.append(file.split('-')[0])
#     texts.append([word for word, flag in pseg.cut(open('train/' + file).read()) if word not in stoplist and flag != 'x'])
# except:
#     continue

dictionary = corpora.Dictionary(texts)
stop_ids = [dictionary.token2id[stopword] for stopword in stoplist if stopword in dictionary.token2id]
once_ids = [tokenid for tokenid, docfreg in iteritems(dictionary.dfs) if docfreg == 1]
dictionary.filter_tokens(stop_ids + once_ids)
dictionary.compactify()

corpus = [dictionary.doc2bow(text) for text in texts]

tfidf = models.TfidfModel(corpus)
# doc_bow = dictionary.doc2bow([word for word, flag in pseg.cut(new_doc) if word not in stoplist and flag != 'x'])
# print(tfidf[doc_bow])

corpus_tfidf = tfidf[corpus]
lsi = models.LsiModel(corpus_tfidf, id2word = dictionary, num_topics = 3)
corpus_lsi = lsi[corpus_tfidf]

data = []
rows = []
cols = []

line_count = 0

for line in corpus_lsi:
    for elem in line:
        rows.append(line_count)
        cols.append(elem[0])
        data.append(elem[1])

    line_count += 1

lsi_matrix = csr_matrix((data, (rows, cols))).toarray()
rarray = np.random.random(size = line_count)

train_set = []
train_tag = []
test_set = []
test_tag = []

for i in range(line_count):
    if rarray[i] < 0.8:
        train_set.append(lsi_matrix[i, :])
        train_tag.append(tag_list[i])
    else:
        test_set.append(lsi_matrix[i, :])
        test_tag.append(tag_list[i])

# clf = svm.LinearSVC()  # 使用线性核
# clf_res = clf.fit(train_set, train_tag)
# train_pred = clf_res.predict(train_set)
# test_pred = clf_res.predict(test_set)

lda = LinearDiscriminantAnalysis(solver = "svd", store_covariance = True)
lda_res = lda.fit(train_set, train_tag)
train_pred = lda_res.predict(train_set)
test_pred = lda_res.predict(test_set)

print('以下是预测结果:')
print(test_pred)
print((test_tag == test_pred).sum() / len(test_tag))

# data = []
# rows = []
# cols = []
#
# line_count = 0
#
# for line in corpus_lsi:  # lsi_corpus_total 是之前由gensim生成的lsi向量
#     for elem in line:
#         rows.append(line_count)
#         cols.append(elem[0])
#         data.append(elem[1])
#     line_count += 1
#
# lsi_sparse_matrix = csr_matrix((data, (rows, cols)))  # 稀疏向量
# lsi_matrix = lsi_sparse_matrix.toarray()  # 密集向量
# print(lsi_matrix)

# print(corpus)
# for item in qiancheng_posts.find({'subIndustry': '技术'}).limit(200):
# industry, subIndustry, name = item['industry'], item['subIndustry'], item['name']
# words = keywords[industry][subIndustry]

# pprint(item)
# for w in words:
#     w_name, w_type = w.split('/')
#
#     if w_name == name or w_name.find(name) != -1 or name.find(w_name) != -1:
#         qiancheng_posts.find_one_and_update({'_id': item['_id']}, {'$set': {'job_divide': w_type}})
#         break

# cursor = qiancheng_posts.aggregate(
#     [{'$sample': {'size': 100}}]
# )
#
# for item in cursor:
#     print('-' * 100)
#     print(list(pseg.cut(item['description'])))

# pprint(item['description'])
# ans = input('\n请输入你所认为的职位类型:')
#
# if len(ans) == 0:
#     continue
#
# try:
#     f = open('train/' + ans + '-' + str(item['_id']), 'w')
#     f.write(item['description'])
#     f.close()
# except:
#     continue
